Crate scoped_trace

source ·
Expand description

Capture scoped backtraces.

Use Trace::root to define the upper unwinding bound of an execution trace, and Trace::leaf to define its lower bounds (the points at which backtraces are collected). The resulting traces are trees, since a single invocation of Trace::root may have multiple sub-invocations of Trace::leaf.

For example, running this program:

use scoped_trace::Trace;

fn main() {
    let (_, trace) = Trace::root(|| foo());
    println!("{trace}");
}

fn foo() {
    bar();
    baz();
}

fn bar() {
    Trace::leaf();
}

fn baz() {
    Trace::leaf();
}

…will produce an output like:

╼ inlining::main::{{closure}} at example.rs:4:38
  ├╼ inlining::foo at example.rs:9:5
  │  └╼ inlining::bar at example.rs:14:5
  └╼ inlining::foo at example.rs:10:5
     └╼ inlining::baz at example.rs:18:5

Structs